package product

import (
	"context"
	"fmt"

	"github.com/gogf/gf/v2/errors/gerror"
	"github.com/gogf/gf/v2/frame/g"
	"github.com/sagoo-cloud/sagooiot/internal/consts"
	"github.com/sagoo-cloud/sagooiot/internal/dao"
	"github.com/sagoo-cloud/sagooiot/internal/model"
	"github.com/sagoo-cloud/sagooiot/internal/service"
)

type sProductDevAssetMetadata struct{}

func sProductDevAssetMetadataNew() *sProductDevAssetMetadata {
	return &sProductDevAssetMetadata{}
}
func init() {
	service.RegisterProductDevAssetMetadata(sProductDevAssetMetadataNew())
}

// GetDevAssetMetadataList 获取列表数据
func (s *sProductDevAssetMetadata) GetDevAssetMetadataList(ctx context.Context, in *model.GetDevAssetMetadataListInput) (total, page int, list []*model.DevAssetMetadataOutput, err error) {
	err = g.Try(ctx, func(ctx context.Context) {
		m := dao.DevAssetMetadata.Ctx(ctx).Where(dao.DevAssetMetadata.Columns().ProductKey, in.ProductKey)
		total, err = m.Count()
		if err != nil {
			err = gerror.New("获取总行数失败")
			return
		}
		page = in.PageNum
		if in.PageSize == 0 {
			in.PageSize = consts.PageSize
		}
		if in.KeyWord != "" {
			m = m.WhereOrLike(dao.DevAssetMetadata.Columns().Name, "%"+in.KeyWord+"%")
			m = m.WhereOrLike(dao.DevAssetMetadata.Columns().Title, "%"+in.KeyWord+"%")
		}
		err = m.Page(page, in.PageSize).Order("created_at desc").Scan(&list)
		if err != nil {
			err = gerror.New("获取数据失败")
		}
	})
	return
}

// GetDevAssetMetadataById 获取指定ID数据
func (s *sProductDevAssetMetadata) GetDevAssetMetadataById(ctx context.Context, id int) (out *model.DevAssetMetadataOutput, err error) {
	err = dao.DevAssetMetadata.Ctx(ctx).Where(dao.DevAssetMetadata.Columns().Id, id).Scan(&out)
	return
}

// GetDevAssetMetadataById 获取指定ID数据
func (s *sProductDevAssetMetadata) GetDevAssetMetadataByProductKey(ctx context.Context, productKey string) (out *model.DevAssetMetadataOutput, err error) {
	err = dao.DevAssetMetadata.Ctx(ctx).Where(dao.DevAssetMetadata.Columns().ProductKey, productKey).Scan(&out)
	return
}

func (s *sProductDevAssetMetadata) total(ctx context.Context, productKey string) int {
	res, _ := dao.DevAssetMetadata.Ctx(ctx).Where(dao.DevAssetMetadata.Columns().ProductKey, productKey).Count()
	return res
}

// AddDevAssetMetadata 添加数据
func (s *sProductDevAssetMetadata) AddDevAssetMetadata(ctx context.Context, in model.AddDevAssetMetadata) (err error) {
	total := s.total(ctx, in.ProductKey)
	in.FieldName = "ext" + fmt.Sprintf("%02d", total+1)
	_, err = dao.DevAssetMetadata.Ctx(ctx).Data(&in).Insert()
	return
}

// EditDevAssetMetadata 修改数据
func (s *sProductDevAssetMetadata) EditDevAssetMetadata(ctx context.Context, in model.EditDevAssetMetadata) (err error) {
	dao.DevAssetMetadata.Ctx(ctx).FieldsEx(dao.DevAssetMetadata.Columns().Id).
		Where(dao.DevAssetMetadata.Columns().Id, in.Id).Update(in)
	return
}

// DeleteDevAssetMetadata 删除数据
func (s *sProductDevAssetMetadata) DeleteDevAssetMetadata(ctx context.Context, Ids []int) (err error) {
	_, err = dao.DevAssetMetadata.Ctx(ctx).WhereIn(dao.DevAssetMetadata.Columns().Id, Ids).Delete()
	return
}
